package com.cskaoyan.other;

import java.io.*;
import java.util.Scanner;

/*
        标准输入输出流

        System类中的字段in
            代表了系统的标准输入，默认的输入设备是键盘
            System.in的类型是InputStream

        System类中的字段out
            代表了系统的标准输出，默认的输出设备是显示器
            System.out的类型是PrintStream，PrintStream是OutputStream的子类


            练习：利用System.in 完成Scanner的nextLine()的功能。
             思路: BufferedReader 实现了读取一行字符串的readLine方法


 */
public class Demo1 {

    public static void main(String[] args) throws IOException {
        // 演示标准输入流和标准输出流
        //basic();

        // 测试标准输入流的read方法(阻塞方法)
        //testInput();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String lineStr;

        // 1. 其实，System.in 标准输入流的 read(readLine)方法是一个阻塞方法
        // 2. 当read方法被调用的时候，如果此时，实际没有键盘输入，此时read(readLine)会阻塞(等待)
        // 3. 这种阻塞状态，一直维持到，有键盘输入数据, 方法才返回

        //  可以基于自定义协议，终止while循环
        while ((lineStr = br.readLine()) != null) {
            if ("finish".endsWith(lineStr)) {
                // 当发现输入的字符串是finish，主动终止循环
                break;
            }
            System.out.println(lineStr);
        }



    }

    private static void testInput() throws IOException {
        // 测试标准输入流的read方法，利用read方法读取键盘数据
        InputStream in = System.in;

        // 1. 当调用标准输入流的read方法之后，如果没有通过键盘录入数据，程序阻塞等待
        // 2. 当我键盘录入一个字符，读取到的是字符对应编码值  a   97
        // 所以read很特殊，它是一个阻塞方法
        int readByte = in.read();
        System.out.println(readByte);
    }

    private static void basic() {
        // 标准数据流，接收键盘录入的数据
        InputStream in = System.in;

        // 标准输出流 将数据输出到屏幕
        PrintStream out = System.out;
    }
}
